package com.AdvancedDemos.继承.模板设计模式案例1.service;

import com.AdvancedDemos.继承.模板设计模式案例1.domain.CheckCode;

import java.util.ArrayList;
import java.util.Random;

/**
 * 因为TencentSendMsg类与AliyunSendMsg类中功能几乎完全重复,只有部分不同,故使用此抽象类来作为父类,提取两者中重复的部分,并将不同的部分做成抽象函数,TencentSendMsg类与AliyunSendMsg类中只需要实现父类SendCheckCode中没有实现的抽象函数即可
 */
abstract public class SendCheckCode {

    // 存储短信验证码的集合
    public ArrayList<CheckCode> arrayList = new ArrayList<>();

    // 定义发送短信验证码时可选的数字字符
    public char[] chs = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

    // 发送短信验证码的方法
    final public void sendMsg(String phone) {

        // 补全代码
        //随机从chs数组中取字符,拼接字符串, -- 循环4次 ,返回

        //产生检验码
        int codeLength = 4;
        Random rd = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < codeLength; i++) {
            sb.append(chs[rd.nextInt(chs.length)]);
        }
        String checkCode = sb.toString();

        //发送校验码
        sendDifferentMessage(phone, checkCode);

        //存储检验码
        CheckCode cc = new CheckCode();
        cc.setCheckCode(checkCode);
        cc.setPhone(phone);
        arrayList.add(cc);
    }

    /**
     * 抽象方法等待子类中给出不同实现,来发送不同平台的验证码
     *
     * @param phone
     * @param checkCode
     */
    abstract void sendDifferentMessage(String phone, String checkCode);
}
